/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	TaskMgr.java
 * 模块说明：	
 * 修改历史：
 * Jun 15, 2007 - lxm - 创建。
 */
package com.hd123.rumba.runtime.backprocess;

import java.util.ArrayList;
import java.util.List;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.exception.ParameterException;

/**
 * 后台任务 | 管理员
 * <p>
 * 
 * 这是一个Singleton。通过{@link #getInstance()}方法取得唯一的对象实例。
 * <p>
 * 
 * 其核心依赖Timer对象，根据指定的时间触发{@link Task#TaskRun}对象，然后由此对象触发创建后台处理的执行线程对象。要求对象必须是{@link BackProcess}的派生类。
 * 
 * @author lxm
 * 
 */
public class TaskMgr {

  private static TaskMgr instance = null;
  private List<Task> tasks = new ArrayList<Task>();

  private TaskMgr() {
    super();
  }

  public static TaskMgr getInstance() {
    if (instance == null)
      instance = new TaskMgr();
    return instance;
  }

  /**
   * 注册一个后台任务。
   * 
   * @param nature
   *          指定被注册的后台任务的性质对象。
   * @param schedule
   *          指定被注册的后台任务的调度对象。
   * @return 返回由此创建的后台任务对象。
   * @throws BusinessException
   */
  public Task registerTask(TaskNature nature, ITaskSchedule schedule) throws BusinessException {
    this.checkParameterNotNull(nature, "nature");
    this.checkParameterNotNull(schedule, "schedule");

    Task task = Task.create(nature, schedule);
    tasks.add(task);
    task.start();

    return task;
  }

  /**
   * 取消注册指定的后台任务。
   * <p>
   * 
   * 还将同时取消已安排的任务。
   * 
   * @param task
   *          指定被取消注册的后台任务对象。
   * @throws BusinessException
   */
  public void unregisterTask(Task task) throws BusinessException {
    this.checkParameterNotNull(task, "task");
    if (tasks.indexOf(task) < 0)
      return;

    task.cancel();
    tasks.remove(task);
  }

  /**
   * 取得所有注册的后台任务。
   * 
   * @return 返回后台任务列表。
   */
  public List<Task> getTasks() {
    return tasks;
  }

  /**
   * 根据后台任务性质对象找到所有对应的后台任务。
   * 
   * @param nature
   *          指定的后台任务性质对象。
   * @return 返回后台任务对象列表，若找不到则返回null。
   * @throws BusinessException
   */
  public List<Task> getTasksByNature(TaskNature nature) throws BusinessException {
    List<Task> ret = new ArrayList();
    if (nature == null)
      return ret;
    
    for (Task task : this.tasks)
      if (task.getNature().equals(nature))
        ret.add(task);
    return ret;
  }

  protected void checkParameterNotNull(Object param, String paramName) throws ParameterException {
    if (param == null)
      throw new ParameterException("必须的参数" + paramName + "不能为null");
  }
}
